package com.cw.util;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.annotation.ExcelProperty;
import com.cw.util.CellStyleModel;
import org.apache.poi.ss.usermodel.IndexedColors;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author liuYi
 * @since 2022-03-31
 */
public class CellColorUtil {

    /**
     * 生成Excel单元格字体变色构造器<br/>
     * {@link #sampleValue()}此方法为Map集合入参的参照,
     * {@link CellStyleModel}中有其他样式参数待供使用需要时自行查看<br/>
     * {@link ExcelProperty}中的{@link ExcelProperty#index()}参数必须从0开始
     * <h1>此方法只适用于{@link EasyExcel}</h1>
     * @param dataList  数据集合
     * @param map       颜色记录器
     * @param sheetName sheet的名称
     * @author liuYi
     * @since 2022/4/1
     * @return net.sinodata.smartperform.dto.CustomCellStyleHandler
     */
    public static <T> CustomCellStyleHandler cellFontColorBySameValue(List<T> dataList, Map<String, Map<String, IndexedColors>> map, String sheetName) {
        List<CellStyleModel> cellStyleList = new ArrayList<>();
        for (int i = 0; i < dataList.size(); i++) {
            T t = dataList.get(i);
            Class<?> aClass = t.getClass();
            for (String key : map.keySet()) {
                try {
                    //调用getter方法
                    Method method = aClass.getMethod("get" + upperFirst(key));
                    Object invokeValue = method.invoke(t);
                    if (invokeValue == null) { continue; }

                    String toString = invokeValue.toString();
                    //检查是否有需要变色的内容值存在
                    Map<String, IndexedColors> valueCheckMap = map.get(key);
                    if (!valueCheckMap.containsKey(toString)) { continue; }
                    IndexedColors indexedColors = valueCheckMap.get(toString);

                    //获取在excel中的坐标
                    Field declaredField = aClass.getDeclaredField(key);
                    ExcelProperty annotation = declaredField.getAnnotation(ExcelProperty.class);
                    int index = annotation.index() ;
                    int i1 = i + 1;
                    cellStyleList.add(CellStyleModel.createFontColorCellStyleModel(sheetName, i1, index, indexedColors));

                } catch (NoSuchMethodException e) {
                    System.out.println("map集合中传入的 参数值不存在于对象当中请检查" + e);
                } catch (InvocationTargetException e) {
                    System.out.println("调用的方法内部出错误了" + e);
                } catch (IllegalAccessException e) {
                    System.out.println("非法调用" + e);
                } catch (NoSuchFieldException e) {
                    e.printStackTrace();
                }
            }
        }
        return new CustomCellStyleHandler(cellStyleList);
    }


    /**
     * 大写第一个字母
     * @param src 源字符串
     * @author liuYi
     * @since 2022-1-13
     * @return String 返回第一个大写后的字符串
     */
    public static String upperFirst(String src) {
        if (Character.isLowerCase(src.charAt(0))) {
            return 1 == src.length() ? src.toUpperCase() : Character.toUpperCase(src.charAt(0)) + src.substring(1);
        }
        return src;
    }

    @Deprecated
    protected void sampleValue() {
        Map<String, Map<String, IndexedColors>> map = new HashMap<>(1);

        //列如我想将name变量只要他的值为刘艺、刘异、刘翼输出为红色和黄色与粉色.
        String key = "name";
        //自定义不同的值与不同的字体
        Map<String, IndexedColors> value = new HashMap<>(3);
        value.put("刘艺", IndexedColors.RED);
        value.put("刘异", IndexedColors.YELLOW);
        value.put("刘翼", IndexedColors.PINK);
        map.put(key, value);

        //下列代码与上面无关只是单纯的不想看map变量报警告
        map.keySet().forEach(System.out::println);
    }

    public static void main(String[] args) {
        EasyExcel.write().registerWriteHandler(CellColorUtil.cellFontColorBySameValue(new ArrayList<>(), new HashMap<>(), "sheet"));
    }
}
